package com.反射Reflection.Reflection___;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

public class Reflection_Access_Fields  {
    public static void main(String[] args) throws Exception {
        /// 1.加载类
        Class<?> cls = Class.forName("com.反射Reflection.Reflection___.Person");

        /// 2.反射得到构造器再创建对象；
        Object o = cls.getDeclaredConstructor().newInstance();

        System.out.println("===爆破访问所有属性===================");
        ///3.得到所有的属性遍历
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            /// 爆破访问，私有的也可以访问；
            field.setAccessible(true);
            System.out.println(field.getName()+"的值 = "+field.get(o));
        }


        System.out.println("\n\n===set赋值==================");
        /// 4.设置值 字段.set(对象, 值) 如果字段是静态的对象可以设置成null；
        Field n1 = cls.getDeclaredField("n1");  ///得到静态属性n1
        n1.setAccessible(true);///因为n1是private的，爆破访问
        System.out.println("设置前"+n1.getName()+"的值 = "+ n1.get(null));
        n1.set(null,500);     ///将静态属性n1设置成500；   //n1.set(o,500);也可以该对象的静态属性，因为静态属性是类共有的；
        System.out.println("设置后"+n1.getName()+"的值 = "+ n1.get(null));        //System.out.println(n1.get(null));同理

    }
}

class Person{
    private static int n1 = 22;
    private final String s1 = "hello";
    private static final boolean b1 = true;
}